package cn.doitedu.operate

import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.{DataFrame, SparkSession}

/**
 * @Date 22.4.10
 * @Created by HANGGE
 * @Description
 */
object C02_DSL_SELECT {
  Logger.getLogger("org").setLevel(Level.ERROR)
  def main(args: Array[String]): Unit = {
    // 1 获取会话
    val session = SparkSession.builder()
      .appName(this.getClass.getSimpleName)
      .master("local[*]")
      .getOrCreate()
     // 导入SQL函数和隐式
    import  session.implicits._
    // 具有丰富的操作字段的函数
    import  org.apache.spark.sql.functions._
    // 2 加载数据   创建DataFrame
    val df: DataFrame = session.read.option("header" , true).option("inferSchema",true).csv("file:///D://code/doit30_spark_sql/data/csv/Teacher2.csv")

     df.printSchema()

    /**
     * root
     * |-- id: integer (nullable = true)
     * |-- name: string (nullable = true)
     * |-- age: integer (nullable = true)
     * |-- gender: string (nullable = true)
     * |-- city: string (nullable = true)
     * |-- sal: integer (nullable = true)
     */

    //=====================================================
    //=======================查询指定的字段==============================
    // 注意  输入正确的字段名
    // -------------方式一
    df.select("id" , "name","gender").show()
    //--------------方式二
    // selectExpr 表达式 支持运算和函数  别名的定义
    // 参数是SQL片段  select  表达式   from
    df.selectExpr("id+1" , "concat(name,gender) as name_gender").show()
    //--------------方式三
    // $"字段名"  是一个对象 返回值的对象  可以计算
    df.select($"id" + 1 , $"name").show()
    //--------------方式四
    // 单边引号获取指定的字段的值 可以进行计算
    df.select('id + 10, 'name ,'age ).show()
    //--------------方式五
    // col(字段)  返回结果可计算
    df.select(col("id")+ 100 , col("name")).show()
    //--------------方式六
    df.select(df("id")+ 100 , df("name")).show()

    df.select('id.plus(10).as("uid"), 'name ,'age ).show()

  }

}
